package org.zoomdev.zoom.security.utils;

import static org.zoomdev.zoom.security.Sensitives.MASK_CHAR;

/**
 * 给信息打码（脱敏）
 */
public final class SensitiveUtils {

    /**
     * 身份证
     *
     * @param data
     * @return
     */
    public static String idCard(String data) {
        if (data == null) return null;
        if (data.length() >= 15) {
            return defaultSensitive(data, 3, 4, MASK_CHAR);
        }
        return data;
    }

    /**
     * 默认地址脱敏算法
     * - 保留前3个字符
     * - 隐藏中间部分
     * - 保留最后4个字符
     *
     * @param data 原始地址
     * @return 脱敏后的地址
     */
    public static String address(String data) {
        if (data == null) {
            return null;
        }
        return defaultSensitive(data, 3, 4, MASK_CHAR);
    }

    /**
     * 自定义地址脱敏算法
     *
     * @param data       原始地址
     * @param prefixKeep 保留的前缀字符数
     * @param suffixKeep 保留的后缀字符数
     * @param maskChar   脱敏替换字符
     * @return 脱敏后的地址
     */
    public static String defaultSensitive(String data, int prefixKeep, int suffixKeep, String maskChar) {
        if (data == null || data.isEmpty()) {
            return "";
        }

        // 如果地址太短，直接返回全脱敏
        int length = data.length();
        if (length <= prefixKeep + suffixKeep) {
            return repeat(maskChar, Math.min(4, length));
        }

        // 构建脱敏地址
        StringBuilder sb = new StringBuilder();
        // 保留前缀
        sb.append(data.substring(0, prefixKeep));
        // 添加脱敏部分
        sb.append(repeat(maskChar, Math.max(1, length - prefixKeep - suffixKeep)));
        // 保留后缀
        sb.append(data.substring(length - suffixKeep));

        return sb.toString();
    }

    /**
     * 智能地址脱敏算法
     * - 自动识别省市区并保留
     * - 对详细地址部分进行脱敏
     *
     * @param address 完整地址
     * @return 脱敏后的地址
     */
    public static String smartAddress(String address) {
        if (address == null || address.isEmpty()) {
            return "";
        }

        // 尝试分割省市区和详细地址
        String[] parts = address.split("(?<=省|市|区|县|镇|乡|街道)");
        if (parts.length < 2) {
            // 无法分割，使用默认脱敏
            return address(address);
        }

        // 保留省市区部分
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < parts.length - 1; i++) {
            result.append(parts[i]);
        }

        // 对详细地址部分进行脱敏
        String detail = parts[parts.length - 1];
        if (detail.length() > 4) {
            // 保留详细地址的前1个和后3个字符
            result.append(defaultSensitive(detail, 1, 3, MASK_CHAR));
        } else {
            // 短地址直接显示
            result.append(detail);
        }

        return result.toString();
    }

    /**
     * email
     *
     * @param email
     * @return
     */
    public static String email(String email) {
        if (email == null) return null;

        int atIndex = email.indexOf("@");
        if (atIndex == -1) {
            // 没有@符号，按普通字符串处理
            return defaultSensitive(email, 2, 2, MASK_CHAR);
        }

        String prefix = email.substring(0, atIndex);
        String domain = email.substring(atIndex);

        if (prefix.length() <= 1) {
            return MASK_CHAR + domain;
        } else if (prefix.length() == 2) {
            return prefix.charAt(0) + MASK_CHAR + domain;
        } else if (prefix.length() == 3) {
            return prefix.charAt(0) + MASK_CHAR + prefix.charAt(2) + domain;
        } else {
            return defaultSensitive(prefix, 2, 0, MASK_CHAR) + domain;
        }
    }

    /**
     * 电话
     *
     * @param data
     * @return
     */
    public static String phone(String data) {
        if (data == null) return null;
        return defaultSensitive(data, 3, 4, MASK_CHAR);
    }

    /**
     * 银行卡号
     *
     * @param data
     * @return
     */
    public static String bankCard(String data) {
        if (data == null) return null;
        return defaultSensitive(data, 4, 4, MASK_CHAR);
    }

    /**
     * 姓名
     *
     * @param name
     * @return
     */
    public static String chineseName(String name) {
        if (name == null) return null;
        if (name.length() == 2) {
            return name.charAt(0) + MASK_CHAR;
        } else if (name.length() == 3) {
            return name.charAt(0) + "**";
        } else if (name.length() == 4) {
            return name.substring(0, 2) + "**";
        } else if (name.length() > 4) {
            return defaultSensitive(name, 2, 1, MASK_CHAR);
        }
        return name;
    }

    /**
     * 截断字符串
     */
    public static String truncate(String text, int len) {
        if (text == null) {
            return null;
        }
        if (text.length() < len) {
            return text;
        }
        return text.substring(0, len) + "...";
    }

    /**
     * 重复字符串
     *
     * @param str   要重复的字符串
     * @param count 重复次数
     * @return 重复后的字符串
     */
    private static String repeat(String str, int count) {
        if (count <= 0) return "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < count; i++) {
            sb.append(str);
        }
        return sb.toString();
    }

    private static StringBuilder createMask(StringBuilder sb, int count) {
        for (int i = 0; i < count; i++) {
            sb.append(MASK_CHAR);
        }
        return sb;
    }


}
